# x-> 形状默认(句子长度,句子数,词维度)
# h-> 形状(隐藏层层数,橘子树,隐层维度)
import torch.nn as nn
import torch

# todo:1 - 句子长度为1的输入
# 每个句子只有一个词组成 一个词代表一句话
def demo01():
    # 初始化x (句子长度/词数,句子数,词维度)
    # 10个句子,每个句子一个词,词向量维度为10
    x = torch.randn(size = (1,5,10))

    # 实例化RNN层对象
    # input_size : 输入词维度 或者 输入层的特征个数
    # hidden_size: rnn层的隐藏层维度 或者 隐藏层特征个数
    # num_layers: 默认1层,rnn层数 或者隐藏层层数
    # batch_first:
    # 默认False - > 输入和输出的形状为(句子长度,句子数,词维度)
    # True - > 输入和输出的形状为(句子数,句子长度,词维度) 后续transformer模型都是这个形状
    rnn = nn.RNN(input_size=10
                 ,hidden_size= 20
                 ,num_layers=1
                 ,batch_first=False)

    # 初始化h0(显性初始化) ,如果不进行初始化,默认初始化为0
    # 形状 - > (隐藏层层数,句子数,隐藏维度)
    h0 = torch.zeros(size = (1,5,20))

    #调用rnn层对象,生成output和hn
    output,hn = rnn(x,h0)
    print('output--->',output.shape,output)
    print('output--->',h0.shape,h0)